/* 困难题

输入描述：
一组输入整数序列I和一组规则整数序列R，I和R序列的第一个整数为序列的个数（个数不包含第一个整数）；整数范围为0~(2^31)-1，序列个数不限

输出描述：
从R依次中取出R<i>，对I进行处理，找到满足条件的I： 
I整数对应的数字需要连续包含R<i>对应的数字。比如R<i>为23，I为231，那么I包含了R<i>，条件满足 。 

按R<i>从小到大的顺序:
(1)先输出R<i>； 
(2)再输出满足条件的I的个数； 
(3)然后输出满足条件的I在I序列中的位置索引(从0开始)； 
(4)最后再输出I。 

附加条件： 
(1)R<i>需要从小到大排序。相同的R<i>只需要输出索引小的以及满足条件的I，索引大的需要过滤掉 
(2)如果没有满足条件的I，对应的R<i>不用输出 
(3)最后需要在输出序列的第一个整数位置记录后续整数序列的个数(不包含“个数”本身)

--------------------------------------------------
序列I：15,123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123（第一个15表明后续有15个整数） 
序列R：5,6,3,6,3,0（第一个5表明后续有5个整数） 
输出：30, 3,6,0,123,3,453,7,3,9,453456,13,453,14,123,6,7,1,456,2,786,4,46,8,665,9,453456,11,456,12,786

30----后续有30个整数
3----从小到大排序，第一个R<i>为0，但没有满足条件的I，不输出0，而下一个R<i>是3
6--- 存在6个包含3的I 
0--- 123所在的原序号为0 
123--- 123包含3，满足条件
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//链表形式储存成员
typedef struct {
    int place;
    int neirong;
    void *next;
} chengyuan_struct ;
//链表根节点 
typedef struct {
    int index;
    int searchcnt;
    chengyuan_struct* firstchengyuan;
}root ;

//幂函数 返回a的b次幂  
int mi(int a, int b)
{
    int res = 1;
    if (b == 0) {
        return 1;
    }
    for (int i = 1; i <= b; i++) {
        res = res * a;
    }
    return res;
}
//判断a里面是否包含b
char baohan(int a, int b)
{   
    int i = 0;
    int x = 10^0;
    int y = b / x;
    while(b / mi(10, i)) {
        x=10^i;
        y=b/x;
        i++;
    }
    //i表示b的位数
    if (b==0) {
        while (a) {
            if(a % 10) {
                a = a / 10;
            } else {
                return 1;
            }
        }
        return 0;
    }
    while (a >= b) {
        if((a - b) % mi(10, i)) {
            a = a / 10;
        } else {
            return 1;
        }
    }
    return 0;
}
//删除数组data中place编号的元素
void delys(int *data, int cnt , int place)
{
    for (int i = place; i < cnt - 1; i++) {
        data[i] = data[i + 1];
    }
}
//对数组进行排序 并删除重复元素 返回排序后元素个数
int paixu(int *data, int cnt)
{
    int temp = 0;
    int k = 0;

    for (int i = 0; i < cnt - 1; i++) {
        for (int j = i; j < cnt; j++) {
            if (data[i] > data[j]) {
                temp = data[i];
                data[i] = data[j];
                data[j] = temp;
            }
        }
    }
    while (k < cnt - 1) {
        if (data[k] == data[k + 1]) {
            delys(data, cnt, k + 1);
            cnt--;
        } else {
            k++;
        }
    }
    return cnt;
}
//这里我用了malloc 分配内存 因为没有循环调用所以我就没有手动free。。。
int main()
{
    int datacnt = 0;
    int *data = NULL;
    int indexcnt = 0;
    int *index = NULL;
    int outpucnt=0;
    root *result = NULL;
    chengyuan_struct *pointer = NULL;

    scanf("%d", &datacnt);
    data = (int *) malloc(sizeof(int) * datacnt);
    for (int i = 0; i < datacnt; i++) {
        scanf("%d", data + i);
    }

    scanf("%d", &indexcnt);
    index = (int *)malloc(sizeof(int) * indexcnt);
    for (int i = 0; i < indexcnt; i++) {
        scanf("%d",index + i);
    }
    
    indexcnt = paixu(index, indexcnt);
    result = (root *)malloc(sizeof(root) * indexcnt);
    pointer = NULL;
    for (int i = 0; i < indexcnt; i++) {
        result[i].index = index[i];
        result[i].searchcnt = 0;
        for (int j = 0; j < datacnt; j++) {
            if (baohan(data[j], index[i])) {
                result[i].searchcnt++;
                if (result[i].searchcnt == 1) {      
                    //当前根节点下的第一个成员  
                    result[i].firstchengyuan = (chengyuan_struct *)malloc(sizeof(chengyuan_struct));
                    pointer = result[i].firstchengyuan;
                    pointer->neirong = data[j];
                    pointer->place = j;
                    pointer->next = NULL;
                } else {
                    //非当前根节点下第一个成员
                    pointer->next = malloc(sizeof(chengyuan_struct));
                    pointer = (chengyuan_struct *)(pointer->next);
                    pointer->neirong = data[j];
                    pointer->place = j;
                    pointer->next = NULL;
                }
            }
        }
    }
    //统计输出数据个数
    for (int i = 0; i < indexcnt; i++) {
        if (result[i].searchcnt) {
            outpucnt += 2*(result[i].searchcnt + 1);
        }
    }

    printf("%d ",outpucnt);
    //链表遍历输出
    for (int i = 0; i < indexcnt; i++) {
        if (result[i].searchcnt) {   
            printf("%d %d ", result[i].index, result[i].searchcnt);
            pointer = result[i].firstchengyuan;
            while (pointer != NULL) {
                printf("%d %d ",pointer->place, pointer->neirong);
                pointer = (chengyuan_struct *)(pointer->next);
            }
            
        }
    }
}


